/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package be.hogent.iii.project.server.netwerk;

/**
 *
 * @author Dieter Van der Stock
 */
import be.hogent.iii.project.common.bericht.Bericht;
import be.hogent.iii.project.server.berichthandlers.BerichtHandler;
import com.thoughtworks.xstream.XStream;
import java.util.LinkedList;
import java.util.List;

public class VerwerkXMLWorker implements Runnable {

    private List queue = new LinkedList();
    private final static String handlerPackage = "be.hogent.iii.project.server.berichthandlers.Server";

    public void verwerkData(Server server, String nickname, byte[] data, int aantalBytes) {
        //we krijgen nieuwe data binnen van een serverobject (moet dat wel?) met bijhorende info zoals herkomst
        byte[] dataKopie = new byte[aantalBytes];
        System.arraycopy(data, 0, dataKopie, 0, aantalBytes);
        synchronized (queue) {
            //we maken een nieuw dataEvent aan en steken het in de queue
            queue.add(new ServerDataEvent(server, nickname, dataKopie));
            queue.notify(); //even laten weten dat er iets nieuws instaat
        }
    }

    public void run() {
        ServerDataEvent dataEvent;

        while (true) {
            synchronized (queue) {
                //Zolang er door verwerkData niets nieuw in de queue gezet wordt, wachten we
                while (queue.isEmpty()) {
                    try {
                        queue.wait();
                    } catch (InterruptedException e) {
                    //Hier doen we niet echt iets mee..
                    }
                }
                //Er is iets toegevoegd, we halen het uit de queue en steken het in een dataEvent
                dataEvent = (ServerDataEvent) queue.remove(0);
            }

            XStream xStream = new XStream();
            System.out.println("Data in stringvorm uitschrijven");
            byte[] data = dataEvent.getData();
            System.out.println("inkomende data, per bericht");
            System.out.println("-------------------");
            System.out.println(new String(data));
            System.out.println("-------------------");
            Bericht bericht = (Bericht) xStream.fromXML(new String(data));
            bericht.setZender(dataEvent.getNickname());
            String klassenaam = handlerPackage + bericht.getClass().getSimpleName() + "Handler";
            try {
                Class klasse = Class.forName(klassenaam);
                BerichtHandler handler = (BerichtHandler) klasse.newInstance();
                handler.handle(bericht);
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}

